home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge15.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  5KB  |  258 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22. #ifdef DEVALAFFIX
  23. int             devalaffix(A, B)
  24. register AFFIX A, B;
  25. {
  26.   register char  *rc = c;
  27.   if (((A->r) == nil) && ((A->l) == nil))
  28.     rc = (A->t);
  29.   else {
  30.     sprinta(A);
  31.     *c++ = '\0';
  32.   }
  33.   if (c > cstore_top ) cstore_overflow();
  34.   B -> t =  rc;
  35.   B -> r =  nil;
  36.   B -> l =  nil;
  37.   return true;
  38. }
  39. #endif
  40.  
  41. #ifdef UEVALAFFIX
  42. void uevalaffix() 
  43.    register cont *rq = q;
  44. register AFFIX A_1 = rq->a;
  45. register AFFIX A_0 = (rq -1)->a;
  46.    char *rc = c;
  47.    if ( devalaffix (A_0, A_1)) {
  48.       q = rq -3;
  49.       (*(rq -2)->q)(); 
  50.       rq = q +2;
  51.    }
  52.   c = rc;
  53.    (rq -1)->a = A_0;
  54.    rq->a = A_1;
  55.    (rq + 1)->q = uevalaffix; 
  56.    q = rq + 1; 
  57. }
  58. #endif
  59.  
  60. #ifdef UFAIL
  61. void ufail() {             /* fail */
  62.   (++q)->q = ufail;
  63. }
  64.  
  65. #endif
  66.  
  67. #ifdef DFAIL
  68. int dfail() {
  69.   return false;
  70. }
  71. #endif
  72.  
  73. #ifdef USETEXITCODE
  74. void usetexitcode() {             /* set exit code */
  75.   exit_code = 2;
  76.   CONTINUE; 
  77.   (++q)->q = usetexitcode;
  78. }
  79. #endif
  80.  
  81. #ifdef DSETEXITCODE
  82. int dsetexitcode() {
  83.   exit_code = 2;
  84.   return true;
  85. }
  86. #endif
  87.  
  88. #ifdef DGETENV
  89. char * getenv();
  90. int             dgetenv(A, B)
  91. register AFFIX A, B;
  92. {
  93.   register char  *rc = c;
  94.   if (((A->r) == nil) && ((A->l) == nil))
  95.     rc = (A->t);
  96.   else {
  97.     sprinta(A);
  98.     *c++ = '\0';
  99.   }
  100.   if (c > cstore_top ) cstore_overflow();
  101.   B -> t =  getenv(rc);
  102.   if (!B ->t)  return false;
  103.   B -> r =  nil;
  104.   B -> l =  nil;
  105.   return true;
  106. }
  107. #endif
  108.  
  109. #ifdef UGETENV
  110. void ugetenv() 
  111.    register cont *rq = q;
  112. register AFFIX A_1 = rq->a;
  113. register AFFIX A_0 = (rq -1)->a;
  114.    char *rc = c;
  115.    if ( dgetenv (A_0, A_1)) {
  116.       q = rq -3;
  117.       (*(rq -2)->q)(); 
  118.       rq = q +2;
  119.    }
  120.    c = rc;
  121.    (rq -1)->a = A_0;
  122.    rq->a = A_1;
  123.    (rq + 1)->q = ugetenv; 
  124.    q = rq + 1; 
  125. }
  126. #endif
  127.  
  128. #ifdef DERRORMESSAGE  
  129. int x_errline(b,e)
  130. char *b,*e;
  131. {
  132.    if (b> e) {
  133.       *c++ = '\n';
  134.       return;
  135.    }
  136.    if (e > (b+75) ) {
  137.       b = e -75;
  138.       *c++ = '@';
  139.    }
  140.    while (b<=e)
  141.       *c++ = *b++;
  142. }
  143.  
  144. int x_underline(b,e)
  145. char *b,*e;
  146. {
  147.    if (b> e) {
  148.       *c++ = '\n';
  149.       return;
  150.    }
  151.    if (e> b+75) 
  152.       b = e -76;
  153.     for (; b <= e; b++) {
  154.        if (b == mip) {
  155.         int o = *mip;
  156.         o &= 255;
  157.         sprintf(c,"^(%o)\n",o);
  158.         while (*++c);
  159.         break;
  160.        }
  161.        else if (*b == '\t')
  162.         *c++ = '\t';
  163.        else 
  164.         *c++ = '-';
  165.     }
  166. }
  167.           
  168. int x_errmsg()
  169. {
  170.     char *beginmsg,*endmsg,*count;
  171.     int linenumber = 1, cc_error = false;
  172.  
  173.  
  174.     if (*mip == '\0') {
  175.         sprintf(c, "*** Context error, after parsing");
  176.         while (*++c);
  177.                 cc_error = true;
  178.     }
  179.         else {
  180.     /* say line number */
  181.     linenumber = set_ip_start_num;
  182.     for (count = set_ip_start_pos; count < mip;)
  183.         if (*count++ == '\n')
  184.             linenumber += 1;
  185.     if (*count == '\n')
  186.         linenumber += 1;
  187.     sprintf(c, "*** line %d", linenumber);
  188.     while (*++c);
  189.         }
  190.  
  191.     /* say file */
  192.  
  193.     if (*current_file_name != '\0')  {
  194.         sprintf (c,", file: %s", current_file_name);
  195.         while (*++c);
  196.     }
  197.  
  198.     if (rmax >0 ) {
  199.         sprintf(c, ", while parsing \"%s\"",error_msg);
  200.         while (*++c);
  201.     }
  202.         
  203.  
  204.  
  205.  
  206.         if (!cc_error) {
  207.            *c++ = ':';
  208.  
  209.         
  210.        for (beginmsg = mip; *beginmsg != '\n'; beginmsg -= 1) ;
  211.        /* print  x_errline */
  212.        endmsg = mip;
  213.        for (endmsg = mip; *endmsg != '\n';endmsg +=1) ;
  214.        x_errline (beginmsg,endmsg);
  215.        x_underline (beginmsg+1,endmsg);
  216.         } else {
  217.            *c++ = '.';
  218.            *c++ = '\n';
  219.         }
  220.     *c++ = '\0';
  221.     return true;
  222. }
  223.  
  224. int derrormessage(A_0)              /* newname */
  225. register AFFIX A_0;
  226. {
  227.     int             lt = (int) c, lta = (int) 'A';
  228.     A_0->t = c;
  229.     A_0->l = nil;
  230.     A_0->r = nil;
  231.         emsg_count += 1;
  232.     x_errmsg();
  233. }
  234. #endif
  235.  
  236.  
  237. #ifdef UERRORMESSAGE 
  238. void uerrormessage ()
  239. {
  240.     register cont *rq = q;
  241.     register affix *A_0 = rq->a;
  242.     char *rc = c;
  243.     if ( derrormessage (A_0)) {
  244.         q = rq -2;
  245.         (*(rq -1)->q)();
  246.         rq = q +1;
  247.                 emsg_count -= 1;
  248.     }
  249.     rq->a = A_0;
  250.     (rq + 1)->q = uerrormessage;
  251.     q = rq + 1;
  252.     c = rc;
  253.     if (rc > cstore_top ) cstore_overflow();
  254. }
  255. #endif
  256.